package com.future;

import java.util.Arrays;

/**
 * Description: 594. 最长和谐子序列
 * <p>
 * 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
 * <p>
 * 现在，给你一个整数数组 nums ，请你在所有可能的子序列中找到最长的和谐子序列的长度。
 * <p>
 * 数组的子序列是一个由数组派生出来的序列，它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums = [1,3,2,2,5,2,3,7]
 * 输出：5
 * 解释：最长的和谐子序列是 [3,2,2,2,3]
 * <p>
 * 示例 2：
 * <p>
 * 输入：nums = [1,2,3,4]
 * 输出：2
 * <p>
 * 示例 3：
 * <p>
 * 输入：nums = [1,1,1,1]
 * 输出：0
 *  
 * <p>
 * 提示：
 * <p>
 * 1 <= nums.length <= 2 * 10^4
 * <p>
 * -10^9 <= nums[i] <= 10^9
 * <p>
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/longest-harmonious-subsequence
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author weiruibai.vendor
 * Date: 2023/3/15 09:28
 */
public class Solution_594 {

    private static Solution_594 instance = new Solution_594();

    public static void main(String[] args) {
        int[] nums = new int[]{1, 3, 2, 2, 5, 2, 3, 7};
        nums = new int[]{1, 1, 1, 1};
        //nums = new int[]{1, 2, 3, 4};
        System.out.println(instance.findLHS_v1(nums));
        System.out.println(instance.findLHS_v2(nums));
    }

    public int findLHS_v2(int[] nums) {
        Arrays.sort(nums);
        int ans = 0;
        int N = nums.length;
        for (int i = 0; i < N; i++) {
            int tmp = 1;
            int end = i + 1;
            boolean calc = false;
            while (end < N && nums[end] - nums[i] >= 0 && nums[end] - nums[i] <= 1) {
                if (nums[end] - nums[i] == 1) {
                    calc = true;
                }
                tmp++;
                end++;
            }
            if (calc) {
                ans = Math.max(ans, tmp);
            }
        }
        return ans;
    }

    /**
     * @param nums
     * @return
     */
    public int findLHS_v1(int[] nums) {
        int N = nums.length;
        int ans = 0;
        for (int i = 0; i < N; i++) {
            boolean calc = false;
            int tmp = 1;
            for (int j = 0; j < N; j++) {
                if (i == j) continue;
                if (nums[i] + 1 == nums[j] || nums[i] == nums[j]) {
                    if (nums[i] + 1 == nums[j]) {
                        calc = true;
                    }
                    tmp++;
                }
            }
            if (calc) {
                ans = Math.max(ans, tmp);
            }
        }
        return ans;
    }
}
